#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 迭代
"""
d = {'a':1,'b':2,'c':3}
for key in d:
    print(key)
"""

"""
from collections import Iterable
print(isinstance('abc',Iterable)) # str是否可迭代.
print(isinstance([1,2,3],Iterable)) # list是否可迭代.
print(isinstance(123,Iterable)) # 整数是否可迭代.

for i,value in enumerate(['A','B','C']):
    print(i,value)
"""


# 列表生成式
"""
import os 
print([d for d in os.listdir('.')])  # os.listdir可以列出文件和目录。
print('-'*20)

# for循环可以同时使用两个或多个变量.
d = {'x':'A','y':'B','z':'C'}
for k,v in d.items():
    print(k,'=',v)



# 列表生成式可以使用两个变量来生成list.
d = {'x':'A','y':'B','z':'C'}
print([k + '=' + v for k,v in d.items()])

# 把一个list中所有的字符串变成小写.
L = ['Hello','World','IBM','Apple']
print([s.lower() for s in L])
"""


# 创建生成器
"""
g = (x * x for x in range(15))
print(next(g))  # 可以一个一个打印x*x的元素.

for a in g:   # 批量显示x*x计算出来的元素. for循环展示比较快.
    print(a)

"""

# 定义生成器的另一种方法是:
'''
- 如果一个函数定义中包含yield关键字,这个函数就是一个生成器.
'''
"""
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

f = fib(5)
print(f)
for a in f:
    print(a)
"""


# 斐波拉契数列
"""
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        print(b)
        a,b = b,a + b
        n = n + 1
    return 'done'
'''
fib函数定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素。
要把fib函数变成generator(生成器),只需要把print(b)改为yield b就可以了.
'''
# print(fib(6))
"""



# 定义一个generator,依次返回数字1,3,5
"""
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield (3)
    print('step 3')
    yield (5)
# 在执行时,遇到yield就中断,下次又继续执行. 执行3次yield后,已经没有yield可以执行了.

o = odd()
print(next(o))
print(next(o))
print(next(o))
print(next(o))
"""



# 迭代器
# 使用isinstance()判断一个对象是否是可迭代对象.
"""
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance('abc',Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(100,Iterable))


from collections import Iterator
print(isinstance((x for x in range(10)),Iterator))
print(isinstance([],Iterator))
print(isinstance({},Iterator))
print(isinstance('abc',Iterator))

print(isinstance(iter([]),Iterator))
print(isinstance(iter('abc'),Iterator))
"""



# 首先获得Iterator对象
it = iter([1,2,3,4,5])
# 循环
while True:
    try:
        # 获得下一个值
        x = next(it)
        print(x)
    except StopIteration:
        break